<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    "use strict";

    // JS是弱类型的语言  => 语法中有很多不合理,不严谨,不安全的地方  
    
    // ES5 严格模式  =>  JS发展过程中的一次尝试  
    // => 目的: 解决JS语法中存在的不合理,不严谨,不安全的地方  
    //          提高代码的执行效率
    //          为未来版本做准备

    // 如何进入严格模式?
    // 在作用域的最前面添加 "use strict";
    // 1. 全局作用域  => 当前脚本的最前面添加  "use strict";
    // 2. 函数作用域  => 函数的最前面"use strict";


    /* function fn(){
        "use strict";
        var a = 10;
        b = 20;
        console.log(a,b);
    }
    fn(); */


    // 1. 严格模式中,声明变量要通过关键词 var, 不通过关键词直接声明的变量会报错
    // var a = 10;
    // b = 20;
    // console.log(a,b);

    // 2. 严格模式中,函数的参数名,不能重复声明, 重复声明会报错
    // 报错: SyntaxError: Duplicate parameter name not allowed in this context
    // function add(a, b, b) {
    //     console.log(a, b);
    //     return a + b;
    // }
    // var res = add(1, 2, 3)
    // console.log(res);

    // 3. 严格模式中,新增eval作用域, eval中声明的变量是局部的
    // eval("var a = 1; var b = 2; var c = a + b; console.log(a,b,c)"); 
    // console.log(a,b,c);


    // 4. 严格模式中，函数调用时如果没有依存的对象  this -> undefined
    //                            有依存的对象   this -> 依存的对象
    // function fn(){
    //     console.log(this);  
    // }
    // fn();  // 没有依存的对象  this -> undefined
    // window.fn();   // 有依存的对象   this -> 依存的对象

    // document.onclick = function(){
    //     console.log(this);
    // }


    // 5.严格模式中 如果对象的属性不允许被删除 => 强制删除会报错

    //  var zhang = {
    //     name:"张三",
    //     age:18,
    //     height:"177cm",
    //     weight:"70kg",
    // }

    // console.log(delete zhang.name);
    // console.log(delete zhang.age);
    // console.log(delete zhang.height);
    // console.log(delete zhang.weight);

    // console.log(zhang);

    // var x = 10;
    // var y = 20;

    // // 全局变量  => 存在window对象中
    // console.log(delete window.x);
    // console.log(delete window.y);

    // console.log(window.x,window.y);




    var zhang = {};

    Object.defineProperty(zhang,"name",{
        value:"张三",
        writable:false,
        enumerable:false,
        configurable:false,
    })

    Object.defineProperty(zhang,"age",{
        value:18,
        writable:true,
        enumerable:true,
        configurable:true,
    })

    console.log(zhang);

    console.log(delete zhang.name);
    console.log(zhang);


</script>

</html>